home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / HSMODA01 / SETTER.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-21  |  5.9 KB  |  236 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* geschrieben für GNU-C auf ATARI-ST */
  5. /* Zum Einstellen von Parametern in PRG/GTP/TOS/TTP Files, */
  6. /* die nach Harun Scheutzow Definition aufgebaut sind */
  7.  
  8. /* für GNU-C */
  9. /* 8Bit */
  10. #define BYTE char
  11. #define UBYTE unsigned char
  12. /* 16Bit */
  13. #define WORD short
  14. /* 32Bit */
  15. #define LONG long int
  16.  
  17.  
  18. /* Maximallänge des Files */
  19. #define MAXINPLEN 65536L
  20.  
  21. /* ungültig-Markierung in LONG-Tabellen */
  22. #define UNUSEDL 0x80000000L
  23.  
  24.  
  25. WORD ask_for_yes(void)
  26. {
  27.  int a, ok;
  28.  ok = 0;
  29.  while (0 == ok)
  30.  {
  31.   a = getc(stdin) & 0x0ff;
  32.   if ((a == 'j') || (a == 'J') || (a == 'y') || (a == 'Y'))
  33.   {
  34.    a = -1; ok = 1;
  35.   }
  36.   else
  37.   {
  38.    if ((a == 'n') || (a == 'N'))
  39.    {
  40.     a = 0; ok = 1;
  41.    }
  42.   }
  43.  }
  44.  return (WORD)a;
  45. }
  46.  
  47.  
  48.  
  49.  
  50. main(int argc, char *argv[ ])
  51. {
  52.  LONG f, inplen, suchlen;
  53.  LONG *lptr;
  54.  static BYTE inpbuf[MAXINPLEN];
  55.  BYTE  magisch[] = "hAruNs cONfigER";
  56.  BYTE  *xptr, *sptr, *eptr;
  57.  UBYTE cfg_lbyte, cfg_hbyte;
  58.  LONG  magptr;
  59.  FILE *inpfp;
  60.  int i, stop_it;
  61.  static char izbuf[512];
  62.  
  63.  struct {
  64.   WORD branch; /* immer 0x601a */
  65.   LONG tlen; /* Länge des TEXT */
  66.   LONG dlen; /* Länge des DATA */
  67.   LONG blen;
  68.   LONG slen;
  69.   LONG res1;
  70.   LONG prgflags;
  71.   WORD absflag;
  72.  } p_head;
  73.  
  74.  
  75.  printf("Konfigurator für PRG/GTP/TOS/TTP nach Haruns Methode für\n");
  76.  printf("fremdkonfigurierte Programme.\n");
  77.  printf("(C) Harun_Scheutzow@B.maus.de, 1993-11-21\n");
  78.  if (2 == argc)
  79.  {
  80.   if (0 != (inpfp = fopen(argv[1],"rb+"))) /* einfaches = ist hier ok, File lesen & schreiben */
  81.   {
  82.    if (1 == fread(&p_head, sizeof(p_head), 1, inpfp)) /* lies Programmkopf */
  83.    {
  84.     inplen = fread(inpbuf, 1, MAXINPLEN, inpfp); /* lies gesamtes Programm */
  85.     suchlen = p_head.tlen + p_head.dlen;
  86.     if ((inplen > 0) && (inplen < MAXINPLEN) && (suchlen <= inplen))
  87.     {
  88.      /* suche nach dem magischen String in TEXT und DATA */
  89.      sptr = inpbuf;
  90.      eptr = sptr;
  91.      eptr += suchlen;
  92.      f = 0;
  93.      while ( eptr - sptr > 16 && 16 > f)
  94.      {
  95.       if( magisch[f++] != *sptr++ )
  96.       {
  97.        sptr -= f; /* zurück auf Vergleichbeginn */
  98.        f = 0;
  99.        sptr += 2; /*auf nächstes WORD */
  100.       }
  101.       if( f == 16 )
  102.       {
  103.           magptr = *(LONG *)sptr;
  104.        if( sptr - inpbuf - 16 != magptr )
  105.        {
  106.         /* Magischer String stimmte, Zeiger aber nicht, also erstes WORD */
  107.         /* des Strings überspringen und weitersuchen */
  108.            sptr -= 14; 
  109.            f = 0;
  110.        }
  111.       }
  112.      }
  113.      if (16 == f)
  114.      {
  115.       /* magischer String da, Zeiger auch ok */
  116.       sptr += 4;
  117.       printf("\nKonfiguriere Programm %s :\n", argv[1]);
  118.       stop_it = 0;
  119.       while ( *sptr && !stop_it)
  120.       {
  121.        /* Auswerteschleife */
  122.        /* drucke den String aus */
  123.        printf("\n Informationstext:\n%s",(char *)sptr);
  124.        while (0 != *sptr++); 
  125.        if ((LONG)sptr & 1)  sptr++;
  126.        cfg_hbyte = *sptr++;
  127.        cfg_lbyte = *sptr++;
  128.        switch(cfg_hbyte)
  129.        {
  130.        case 0:
  131.         /* Ja/Nein Entscheidung */
  132.         printf(" Aktuelle Einstellung: ");
  133.         if (*((WORD *)sptr))
  134.         {
  135.          printf("Ja.\n");
  136.         }
  137.         else
  138.         {
  139.          printf("Nein.\n");
  140.         };
  141.         printf("  Eingeben: _J_a oder _N_ein.\n");
  142.         *(WORD *)sptr = ask_for_yes();
  143.         sptr += 2; /* Zeiger weiter setzen */
  144.         break;
  145.        case 1:
  146.         /* LONG-Werteliste eingeben */
  147.         f = (LONG)cfg_lbyte;
  148.         if (f)
  149.         {
  150.          printf(" Aktuelle Einstellungen:\n");
  151.          lptr = (LONG *)sptr;
  152.          i = 1;
  153.          while (f--)
  154.          {
  155.           printf("Platz Nr.%d : ",i++);
  156.           if (UNUSEDL == *lptr)
  157.           {
  158.            printf("ungültig\n");
  159.            lptr++;
  160.           }
  161.           else
  162.           {
  163.            printf("%16ld\n",*lptr++);
  164.           };
  165.          };
  166.          printf("\n Neue Werte eingeben, Platz ungültig markieren durch Eingabe von u.\n");
  167.          lptr = (LONG *)sptr;
  168.          f = (LONG)cfg_lbyte;
  169.          i = 1;
  170.          while (f)
  171.          {
  172.           printf("Platz Nr.%d : ",i);
  173.           scanf("%60s",izbuf);
  174.           if ((char)0 == izbuf[0] || 'U' == izbuf[0] || 'u' == izbuf[0])
  175.           {
  176.            /* U-Eingabe, den Platz ungültig markieren */
  177.            i++; f--;
  178.            *lptr++ = UNUSEDL;
  179.           }
  180.           else
  181.           {
  182.            if (1 == sscanf(izbuf, "%li", lptr))
  183.            {
  184.             i++; f--; lptr++;
  185.            }
  186.            else printf("Falsche Eingabe, wiederholen!\n");
  187.           };
  188.          };
  189.          sptr = (BYTE *)lptr;
  190.         }
  191.         else 
  192.         {
  193.          printf("**** File damaged: 0 longs in list.\n");
  194.          stop_it = 1;
  195.         };
  196.         break;
  197.        case 2:
  198.         /* String eingeben */
  199.         /*  NOCH NICHT IMPLEMENTIERT */
  200.         
  201.         /* break; erst später rein, so geht es nach default weiter */
  202.        default:
  203.         printf("**** Unknown Config-Command. File damaged or use newer SETTER.\n Aborted!\n");
  204.         stop_it = 1;
  205.        }
  206.       }
  207.       printf("\nKonfiguration beendet.\nÄnderungen speichern _J_a/_N_ein?\n");
  208.       if (ask_for_yes())
  209.       {
  210.        fseek(inpfp,sizeof(p_head),SEEK_SET); /* nur Prgheader nicht zurückschreiben */
  211.        if (inplen == fwrite(inpbuf, 1, inplen, inpfp))
  212.        {
  213.         printf("Konfiguration erfolgreich.\n");
  214.        }
  215.        else printf("**** Fehler beim Zurückschreiben des Files.\n");
  216.       }
  217.       else printf("Daten NICHT gespeichert.\n");
  218.      }
  219.      else printf("**** The file is not configurable.\n");
  220.     }
  221.     else printf("**** Read Error OR File too long OR not a program\n");
  222.    }
  223.    else printf("**** File too short\n");
  224.    fclose(inpfp);
  225.   }
  226.   else printf("**** Error opening file\n");
  227.  }
  228.  else
  229.  {
  230.   printf("**** Wrong number of parameters!\n");
  231.   printf(" Nutzung:\n");
  232.   printf("setter Filename_des_zu_konfigurierenden_Programms\n");
  233.  }
  234.  return 0;
  235. }
  236.